package com.bzg.jdkProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 *
 * jdk代理也无法进行多重代理，因为它基于接口，而代理出来的是类
 * 代理接口不变，代理类就不变。只不过产生不同实例
 * jdk和cglib可以相互代理，但这种要注意代理逻辑的执行顺序不一定符合预期
 * */
public class JdkProxyStyle {

	public static void main(String[] args) {
		// 输出jdk代理文件，在项目根路径com.sun.proxy报下
		System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
		Object o = Proxy.newProxyInstance(UserService.class.getClassLoader(), new Class[]{UserService.class}, new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				System.out.println(111);
				return proxy;
			}
		});
		System.out.println("第一次jdk代理：class" + o.getClass().getName());
		((UserService)o).test();

//		Object o1 = Proxy.newProxyInstance(o.getClass().getClassLoader(), new Class[]{UserService.class}, new InvocationHandler() {
//			@Override
//			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//				System.out.println(222);
//				return proxy;
//			}
//		});
//		System.out.println("第2次jdk代理：class" + o1.getClass().getName());
//		((UserService)o).test();
	}

}
